package com.cg.client;

import com.cg.client.impl.SystemClientImpl;
import com.cg.dto.*;
import com.cg.entity.*;
import com.cg.vo.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;

/**
 * @ClassName SystemClient
 * @Description 管理客户端
 * @Author CG
 * @Date 2023/12/1 9:20
 **/
@FeignClient(name = "system-provider",fallback = SystemClientImpl.class)
public interface SystemClient {

    /**
     * 查询部门表信息全部信息
     * @return
     */
    @PostMapping("/dep/queryAll")
    public Result<List<Department>> queryAll();



    /**
     * 查询全部Type
     * @return
     */
    @PostMapping("/type/queryTypeAll")
    public Result<List<DictionaryType>> queryTypeAll();


    /**
     * 根据type表的typeCode查询Dictionary类型
     */
    @PostMapping("/dict/queryDicByTypeCode")
    public Result<List<Dictionary>> queryDicByTypeCode(@RequestParam("typeCode") String typeCode);


    /**
     * 用UUID生成codeNum
     */
    @PostMapping("/user/createCodeNum")
    public Result<String> createCodeNum();


    /**
     * 添加新用户
     * @param user:前端传过来要添加的用户信息
     */
    @PostMapping("/user/createUser")
    public Result createUser(@RequestBody User user);


    @PostMapping("/source/createSource")
    Result createSource(@RequestBody Source source);


    /**
     * 用户登录
     * @param user：前端传递过来的用户登录名和密码
     * @return：返回的数据
     */
    @PostMapping("/user/login")
    public Result<LoginUserVo> login(@RequestBody User user);


    /**
     * 通过Token获取用户信息
     * @param token：token
     * @return：用户信息
     */
    @PostMapping("/user/getUserByToken")
    public LoginUserVo getUserByToken(@RequestParam("token") String token);


    /**
     * 分页角色管理
     * @param roleDto
     * @return
     */
    @PostMapping("/role/queryRoleByRoleName")
    public Result<Map<String,Object>> queryRoleByRoleName(@RequestBody RoleDto roleDto);


    /**
     * 通过角色id获取角色信息
     * @param roleId
     * @return
     */
    @PostMapping("/source/querySourceBySourceId")
    public Result<SourceForRoleVo> querySourceBySourceId(@RequestParam("roleId") Integer roleId);


    /**
     * 角色授权
     * @param roleSourceDto
     * @return
     */
    @PostMapping("/role/createRoleSource")
    public Result createRoleSource(@RequestBody RoleSourceDto roleSourceDto);


    /**
     * 验证角色编码
     * @param roleCode
     * @return
     */
    @GetMapping("/role/checkRoleCode")
    public Result checkRoleCode(@RequestParam("roleCode") String roleCode);


    /**
     * 创建角色
     */
    @PostMapping("/role/insertRole")
    public Result insertRole(@RequestBody Role role);



    /**
     * 角色信息修改
     * @param role
     * @return
     */
    @PostMapping("/role/setRole")
    public Result updateRole(@RequestBody Role role);


    /**
     * 角色信息删除
     * @param roleId
     * @return
     */
    @PostMapping("/role/removeRole")
    public Result deleteRoleByRoleId(@RequestParam("roleId") Integer roleId);


    /**
     * 分页查询并根据部门名称模糊查询展示部门信息
     * @param departmentDto
     * @return
     */
    @PostMapping("/dep/queryDepByDepName")
    public Result<Map<String,Object>> queryDepByDepName(@RequestBody DepartmentDto departmentDto);


    /**
     * 员工管理页面分页并按照名称模糊查询
     */
    @PostMapping("/user/list")
    public Result<Map<String,Object>> queryUserByUserName(@RequestBody UserDepRoleDto userDepRoleDto);


    /**
     * 用户授权
     * @param userRoleDto
     * @return
     */
    @PostMapping("/user/createUserRole")
    public Result createUserRole(@RequestBody UserRoleDto userRoleDto);


    /**
     * 加载所有的以及二级菜单权限
     */
    @PostMapping("/source/queryMenuAll")
    public Result<List<MenuAllVo>> queryMenuAll();


    /**
     * 验证权限是否存在
     * @param url
     * @return
     */
    @GetMapping("/source/checkSourceUrl")
    public Result checkSourceUrl(@RequestParam("url") String url);

    /**
     * 删除权限
     */
    @GetMapping("/source/removeSource")
    public Result removeSource(@RequestParam("sourceId") Integer sourceId);

    /**
     * 修改权限的名称
     * @param source
     * @return
     */
    @PostMapping("/source/updateSourceName")
    public Result updateSourceName(@RequestBody Source source);


    /**
     * 用户详情展示
     */
    @GetMapping("/user/getUserByUserId")
    public Result<UserDetailVo> getUserByUserId(@RequestParam("userId") Integer userId);


    /**
     * 启用/禁用
     */
    @PostMapping("/user/updateUserState")
    public Result updateUserState(@RequestParam("id") Integer id);


    /**
     * 修改员工信息
     * @param user
     * @return
     */
    @PostMapping("/user/updateUserByUserId")
    public Result updateUserByUserId(@RequestBody User user);


    /**
     * 删除员工
     */
    @PostMapping("/user/removeUserByUserId")
    public Result removeUserByUserId(@RequestParam("userId") Integer userId);


    /**
     * 查询公告信息
     */
    @PostMapping("/notice/noticeList")
    Result<Map<String,Object>> noticeList(@RequestBody NoticePageDto noticePageDto);


    /**
     * 新增公告信息
     */
    @PostMapping("/notice/createNotice")
    public Result createNotice(@RequestBody NoticeDepartmentDto noticeDepartmentDto);


    /**
     * 根据部门id查询部门详细信息
     */
    @PostMapping("/notice/queryNotice")
    public Result<QueryNoticeByNoticeIdVo> queryNotice(@RequestParam("id") Integer id);


    /**
     * 删除公告信息
     */
    @PostMapping("/notice/deleteNoticeById")
    public Result deleteNoticeById(@RequestParam("noticeId") Integer noticeId);


    /**
     * 根据用户id查询个人的详细信息
     */
    @GetMapping("/user/queryUserInfo")
    public Result<UserShowInfoVo> queryUserInfo(@RequestParam("userId") Integer userId);


    /**
     * 修改公告信息
     */
    @PostMapping("/notice/setNotice")
    public Result setNotice(@RequestBody NoticeDepartmentDto noticeDepartmentDto);


    /**
     * 验证Code是否存在
     */
    @GetMapping("/organize/queryCountByOrgCode")
    public Result queryCountByOrgCode(@RequestParam("orgName") String orgName);


    /**
     * 新增组织编码
     */
    @PostMapping("/organize/createOrganize")
    public Result createOrganize(@RequestBody Organize organize);


    /**
     * 查询组织全部信息-分页并按照名称模糊查询
     */
    @PostMapping("/organize/organizeList")
    public Result<Map<String,Object>> organizeList(@RequestBody OrgPageDto orgPageDto);


    /**
     * 修改组织信息
     */
    @PostMapping("/organize/setOrganize")
    public Result setOrganize(@RequestBody Organize organize);


    /**
     * 删除组织信息
     */
    @PostMapping("/organize/removeOrganize")
    public Result removeOrganize(@RequestParam("id") Integer id);


    /**
     * 查询组织详情
     */
    @PostMapping("/organize/queryOrganizeByOrganizeId")
    public Result<Organize> queryOrganizeByOrganizeId(@RequestParam("organizeId") Integer organizeId);


    /**
     * 验证登录名是否可用
     */
    @PostMapping("/user/checkLoginUser")
    public Result checkLoginUser(@RequestParam("loginUser") String loginUser);


    /**
     * 验证基础信息表code是否重复
     */
    @GetMapping("/baseInfo/checkBaseCode")
    public Result checkBaseCode(@RequestParam("baseCode") String baseCode);

    /**
     * 基础信息展示
     */
    @PostMapping("/baseInfo/baseList")
    public Result<Map<String,Object>> baseList(@RequestBody BasePageDto basePageDto);


    /**
     * 创建基础信息
     */
    @PostMapping("/baseInfo/insertBaseInfo")
    public Result insertBaseInfo(@RequestBody BaseInfo baseInfo);


    /**
     * 修改基础信息
     */
    @PostMapping("/baseInfo/setBaseInfo")
    public Result setBaseInfo(@RequestBody BaseInfo baseInfo);

    /**
     * 删除基础信息
     */
    @PostMapping("/baseInfo/removeBaseInfo")
    public Result removeBaseInfo(@RequestParam("baseInfoId") Integer baseInfoId);


    /**
     * 修改密码
     */
    @PostMapping("/user/setPassword")
    public Result setPassword(@RequestBody UpdateUserDto updateUserDto);


    /**
     * 修改用户登录名
     */
    @PostMapping("/user/setLoginUser")
    public Result setLoginUser(@RequestBody User user);

    /**
     * 新增
     */
    @PostMapping("/type/createDictionaryType")
    public Result createDictionaryType(@RequestBody DictionaryDto dictionaryDto);


    /**
     * 查询数据字典表
     */
    @PostMapping("/type/queryDictionary")
    public Result<Map<String,Object>> queryDictionary(@RequestBody DictionaryPageDto dictionaryPageDto);
}
